%% @author Final
%% @doc @todo Add description to maxteilsumme2zugr.


-module(maxteilsumme2zugr).

%% ====================================================================
%% API functions
%% ====================================================================
-export([summeMatrix/1, maxSumme/1]).



%% ====================================================================
%% Internal functions
%% ====================================================================

summeMatrix([H|T]) -> summeMatrix([H|T], [], 0, 0, 0).
summeMatrix([], Akk, _, _, Zugr) -> {Akk, Zugr};
summeMatrix([H|T], Akk, I, J, Zugr) -> summeMatrix(T, Akk ++ [hd(teilMatrix([H|T], I + 1, J))], 
							  I + 1, J + 1, hd(tl(teilMatrix([H|T], I + 1, J))) + Zugr + 1).

%% Iteration durch j
teilMatrix([H|T], I, J) -> teilMatrix([H|T], 0, [], I, J, 0).
teilMatrix([], _, Akku2, _, _, Zugr) -> [Akku2, Zugr];
teilMatrix([H|T], Akku1, Akku2, I, J, Zugr) -> teilMatrix(T, (Akku1 + H), 
								Akku2 ++ [{Akku1 + H, {I, J + 1}}], I, J + 1, Zugr + 3).

%% Aus der Summen Matrix wird MaxSumme ausgesucht, die entsprechende Indizes werden ausgegeben
maxSumme([H|T]) -> maxSumme(lists:flatten(hd(tuple_to_list(summeMatrix([H|T])))), 0, [], 
							hd(tl(tuple_to_list(summeMatrix([H|T])))), 0).
maxSumme([], MaxSumme, Index, Zugr, ZugrMatrix) -> {MaxSumme, Index, Zugr, ZugrMatrix};
maxSumme([H|T], MaxSumme, Index, Zugr, ZugrMatrix) ->  case hd(tuple_to_list(H)) > MaxSumme of
										  true -> maxSumme(T, hd(tuple_to_list(H)), 
											hd(tl(tuple_to_list(H))), Zugr, ZugrMatrix + 4);
										  false -> maxSumme(T, MaxSumme, Index, Zugr, ZugrMatrix + 2) end.
